
#ifndef CHESSPANE_H
#define CHESSPANE_H

#include "chessboard.h"
#include "chessdefines.h"

class ChessBoard;

/*
 * 定义棋子基类。
 * - 判定是黑棋/白棋，保存棋子的坐标位置
 * - 可检测棋子某个时针方向（共8个）相同颜色的棋子数目。
 */
class ChessPane
{
protected:
    //void SaveChess(int a, int b);//根据位置，保存棋子指针到网格数组

public:
    //类型标识,区分黑白棋。
    const char color;
    int x, y;              //棋子在数组中的横纵坐标
    ChessBoard* board;     //棋盘指针
    ChessPane(int x, int y, ChessBoard* board, char myType = BLANKPLACE);

    //按方向查找相同颜色的棋子,返回值为棋子数，输入参数为上一粒棋子位置[int]，方向[int]
    int CheckStart(int dire);
    /*
     * 查询某个方向的线上，连续相同的棋子数目(含自身)。
     * 这是递归入口，供外部调用
     * @param dx X方向: -1, 0, 1
     * @param dy Y方向: -1, 0, 1
     * @return 该方向上的相同棋子数。
     */
    int CheckStart(int dx, int dy);
    /*
     * 递归实现,Check方法调用,还用于对象之间递归checknext
     * @param dx X方向: -1, 0, 1
     * @param dy Y方向: -1, 0, 1
     * @parem expectType 用做对比判断的颜色类型。
     * @return 该方向上的相同棋子数。
     */
    virtual int Check(int dx, int dy, const char expectType);
};

class WhitePane : public ChessPane
{
public:
    WhitePane(int x, int y, ChessBoard* board):ChessPane(x, y, board, WHITECHESS){};
};

class BlackPane : public ChessPane
{
public:
    BlackPane(int x, int y, ChessBoard* board):ChessPane(x, y, board, BLACKCHESS){};
};

#endif // CHESSPANE_H

